//用户管理头文件
#ifndef USER_MANAGER_H
#define USER_MANAGER_H

#include <string>
#include <vector>
#include <memory>

/**
 * @brief 用户信息结构体
 * 存储用户账号、密码（哈希后）、角色、权限掩码
 */
struct User {
    std::string username;       // 用户名
    std::string password_hash;  // 密码哈希（SHA256）
    uint8_t role;               // 角色：0x01=管理员，0x02=操作员，0x03=观察者
    uint32_t perm_mask;         // 权限掩码（参考权限定义）
    bool is_locked;             // 是否锁定
    int login_attempts;         // 登录失败次数
    uint64_t lock_time;         // 锁定时间（ms）

    // 检查是否有指定权限（权限位是否置1）
    bool hasPermission(uint32_t perm) const {
        return (perm_mask & perm) != 0;
    }
};

/**
 * @brief 用户管理类
 * 处理用户登录、权限校验、用户信息加载/保存
 */
class UserManager {
public:
    UserManager() = default;
    ~UserManager() = default;

    // 加载用户配置（从JSON文件）
    bool loadUsers(const std::string& config_path);

    // 保存用户配置（到JSON文件）
    bool saveUsers(const std::string& config_path);

    // 用户登录（返回是否成功，成功则设置当前用户）
    bool login(const std::string& username, const std::string& password, std::string& err_msg);

    // 用户登出（清空当前用户）
    void logout();

    // 获取当前登录用户
    std::shared_ptr<User> getCurrentUser() const;

    // 添加用户（仅管理员可操作）
    bool addUser(const User& user, std::string& err_msg);

    // 删除用户（仅管理员可操作）
    bool deleteUser(const std::string& username, std::string& err_msg);

    // 修改用户权限（仅管理员可操作）
    bool modifyUserPerm(const std::string& username, uint32_t new_perm_mask, std::string& err_msg);

private:
    // 密码哈希（SHA256）
    std::string hashPassword(const std::string& password);

    // 检查用户是否锁定
    bool isUserLocked(const std::string& username);

    // 解锁用户（超过锁定时间自动解锁）
    void unlockExpiredUsers();

private:
    std::vector<std::shared_ptr<User>> users_;       // 用户列表
    std::shared_ptr<User> current_user_;            // 当前登录用户
    const int MAX_LOGIN_ATTEMPTS = 5;               // 最大登录失败次数
    const uint64_t LOCK_DURATION = 15 * 60 * 1000;  // 锁定时长（15分钟，ms）
};

#endif // USER_MANAGER_H